//leetcode_21:合并两个有序链表
//将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
//        示例 1：
//        l1 = [1,2,4], l2 = [1,3,4]
//        输出：[1,1,2,3,4,4]
//        示例 2：
//        输入：l1 = [], l2 = []
//        输出：[]
//        示例 3：
//        输入：l1 = [], l2 = [0]
//        输出：[0]



public class leetcode_21 {
//方法一：递归
//    终止条件：当两个链表都为空时，表示我们对链表已合并完成。
//    如何递归：我们判断 l1 和 l2 头结点哪个更小，
//    然后较小结点的 next 指针指向其余结点的合并结果。（调用递归）
//    时间复杂度：O(m+n)
//    递归函数每次去掉一个元素，直到两个链表都为空，因此需要调用O(m+n) 次
//    空间复杂度：O(m+n)
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
    static class ListNode{
        int val;
        ListNode next;
        ListNode(int x) { val = x; }

    }



}
